package com.atguigu.netty.dubboRpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    private ChannelHandlerContext context; //上下文
    private String result; //返回的结果
    private String para; //调用方法时传入的参数

    //与服务器的连接创建成功后就会调用,这个方法第一个被调用
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        context=ctx; //因为在其他方法会使用到
    }

    //收到服务器的数据后就会调用
    //第四个被调用
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        result=msg.toString();
        notify(); //唤醒等待的线程
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    //被代理对象调用，发送数据给服务器 -> wait -> 等待被唤醒
    //第三个被调用  waiting  第五个被调用
    @Override
    public synchronized Object call() throws Exception {
        context.writeAndFlush(para);
        //进行wait
        wait(); //等待channelRead方法获取到服务器的结果后，唤醒
        return result; //服务方返回的结果
    }

    //第二个被调用
    void setPara(String para){
        this.para=para;
    }
}
